﻿
#region 作者和版权
/*************************************************************************************
* CLR 版本: 4.0.30319.42000
* 类 名 称: SafeDictionary
* 机器名称: SUNTIA-QL
* 命名空间: ServerFramework.Tools.SafeCollections
* 文 件 名: SafeDictionary
* 创建时间: 2016/1/5 18:58:50
* 作 者: 乔龙 Qiaolong
* 版 权: SafeDictionary说明：本代码版权归乔龙所有，使用时必须带上乔龙网站地址 All Rights Reserved (C) 2016 - 2013
* 签 名: To be or not, it is not a problem !
* 网 站: http://www.suntia.net
* 邮 箱: qiaolong306@qq.com 
* 唯一标识： 1058956d-7e62-41a0-b077-6598c9ba2e65 
*
* 登录用户: simida
* 所 属 域: SUNTIA-QL

* 创建年份: 2016
* 修改时间:
* 修 改 人:
* 
************************************************************************************/
#endregion

using System;
using System.Collections.Generic;



namespace ServerFramework.Tools
{
    /// <summary>
    /// 安全字典
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    public class SafeDictionary<TKey,TValue>
    {
        private readonly object _flagLock = new object();
        private Dictionary<TKey, TValue> _collection = new Dictionary<TKey, TValue>();

        public void Add(TKey k,TValue v)
        {
            lock (_flagLock)
            {
                if (!_collection.ContainsKey(k))
                {
                    _collection.Add(k, v);
                }
                else
                {
                    Log.WriteLog(ELogLevel.LOG_ERROR, "same key");
                }
            }
        }

        public void Remove(TKey k)
        {
            lock (_flagLock)
            {
                _collection.Remove(k);
            }
        }
        public int Count { get{return _collection.Count;}}

        public void Clear()
        {
            lock (_flagLock)
            {
                _collection.Clear();
            }
        }

        public bool ContainsKey(TKey key)
        {
            lock (_flagLock)
            {
               return _collection.ContainsKey(key);
            }
        }

        public bool TryGetValue(TKey key, out TValue value)
        {
            lock (_flagLock)
            {
                return _collection.TryGetValue(key,out value);
            }
        }

        public TValue this[TKey key] 
        { 
            get
            {
                lock (_flagLock)
                {
                    return _collection[key];
                }
            }
            set
            {
                lock (_flagLock)
                {
                    _collection[key] = value;
                }
            }
        }
    }
}


